<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

	<xsl:output method="text" /> 
	<xsl:strip-space elements="*" />
	<xsl:variable name="unquotedNodes" 
					select="(
						'allowBlank',
						'autoHeight',
						'autoWidth',
						'closable',
						'collapsed',
						'collapsible',
						'draggable',
						'errorReader',
						'fileUpload',
						'forceFit',
						'frame',
						'handler',
						'height',
						'html',
						'labelHeight',
						'labelWidth',
						'modal',
						'plain',
						'proxy',
						'reader',
						'renderer',
						'resizable',
						'sm',
						'sortable',
						'store',
						'view',
						'waitMsgTarget',
						'width'
							)" />

	<xsl:key name="fieldSets" match="fields[@name]" use="@name" />
	
	<xsl:template match="/ext-xml">
		<xsl:apply-templates select="array" />
		<xsl:apply-templates select="record" />
		<xsl:apply-templates select="arrayreader | jsonreader | xmlreader" />
		<xsl:apply-templates select="httpproxy | memoryproxy | scripttagproxy" />
		<xsl:apply-templates select="checkboxselectionmodel" />
		<xsl:apply-templates select="groupingstore | jsonstore | simplestore | store" />
		<xsl:apply-templates select="groupingview" />
		<xsl:apply-templates select="datefield" />
		<xsl:apply-templates select="gridpanel" />
		<xsl:apply-templates select="formpanel" />
		<xsl:apply-templates select="window" />
	</xsl:template>
	
	<xsl:template match="array">
		<xsl:text>var </xsl:text>
		<xsl:value-of select="@var"/>
		<xsl:text> = [&#xa;</xsl:text>
		<xsl:call-template name="render-array-rows" />
		<xsl:text>&#x9;&#x9;] ;&#xa;&#xa;</xsl:text>
	</xsl:template>
	
	<xsl:template name="render-array-rows">
		<xsl:for-each select="row">
			<xsl:text>&#x9;&#x9;[</xsl:text>
			<xsl:for-each select="data">
				<xsl:text>'</xsl:text>
				<xsl:value-of select="." />
				<xsl:text>'</xsl:text>
				<xsl:if test="position( ) != last( )"><xsl:text>,</xsl:text></xsl:if>
			</xsl:for-each>
			<xsl:text>]</xsl:text>
			<xsl:if test="position( ) != last( )"><xsl:text>,</xsl:text></xsl:if>
			<xsl:text>&#xa;</xsl:text>
		</xsl:for-each>
	</xsl:template>
	
	<xsl:template match="store">
		<xsl:text>var </xsl:text>
		<xsl:value-of select="@var"/>
		<xsl:text> = new Ext.data.Store({&#xa;</xsl:text>
		<xsl:call-template name="render-attributes-vert"><xsl:with-param name="attributes" select="@*" /><xsl:with-param name="finalcomma" select="false()" /></xsl:call-template>
		<xsl:text>&#x9;&#x9;}) ;&#xa;&#xa;</xsl:text>
	</xsl:template>
	
	<xsl:template match="simplestore">
		<xsl:text>var </xsl:text>
		<xsl:value-of select="@var"/>
		<xsl:text> = new Ext.data.SimpleStore({&#xa;</xsl:text>
		<xsl:call-template name="render-attributes-vert"><xsl:with-param name="attributes" select="@*" /><xsl:with-param name="finalcomma" select="false()" /></xsl:call-template>
		<xsl:text>&#x9;&#x9;}) ;&#xa;&#xa;</xsl:text>
	</xsl:template>
	
	<xsl:template match="jsonstore">
		<xsl:text>var </xsl:text>
		<xsl:value-of select="@var"/>
		<xsl:text> = new Ext.data.JsonStore({&#xa;</xsl:text>
		<xsl:call-template name="render-attributes-vert"><xsl:with-param name="attributes" select="@*" /><xsl:with-param name="finalcomma" select="false()" /></xsl:call-template>
		<xsl:text>&#x9;&#x9;}) ;&#xa;&#xa;</xsl:text>
	</xsl:template>
	
	<xsl:template match="groupingview">
		<xsl:text>var </xsl:text>
		<xsl:value-of select="@var"/>
		<xsl:text> = new Ext.grid.GroupingView({&#xa;</xsl:text>
		<xsl:call-template name="render-attributes-vert"><xsl:with-param name="attributes" select="@*" /><xsl:with-param name="finalcomma" select="false()" /></xsl:call-template>
		<xsl:text>&#x9;&#x9;}) ;&#xa;&#xa;</xsl:text>
	</xsl:template>
	
	<xsl:template match="groupingstore">
		<xsl:text>var </xsl:text>
		<xsl:value-of select="@var"/>
		<xsl:text> = new Ext.data.GroupingStore({&#xa;</xsl:text>
		<xsl:apply-templates select="sortinfo" />
		<xsl:call-template name="render-attributes-vert"><xsl:with-param name="attributes" select="@*" /><xsl:with-param name="finalcomma" select="false()" /></xsl:call-template>
		<xsl:text>&#x9;&#x9;}) ;&#xa;&#xa;</xsl:text>
	</xsl:template>
	
	<xsl:template match="httpproxy">
		<xsl:text>var </xsl:text>
		<xsl:value-of select="@var"/>
		<xsl:text> = new Ext.data.HttpProxy({&#xa;</xsl:text>
		<xsl:call-template name="render-attributes-vert"><xsl:with-param name="attributes" select="@*" /><xsl:with-param name="finalcomma" select="false()" /></xsl:call-template>
		<xsl:text>&#x9;&#x9;}) ;&#xa;&#xa;</xsl:text>
	</xsl:template>
	
	<xsl:template match="memoryproxy">
		<xsl:text>var </xsl:text>
		<xsl:value-of select="@var"/>
		<xsl:text> = new Ext.data.MemoryProxy({&#xa;</xsl:text>
		<xsl:call-template name="render-attributes-vert"><xsl:with-param name="attributes" select="@*" /><xsl:with-param name="finalcomma" select="false()" /></xsl:call-template>
		<xsl:text>&#x9;&#x9;}) ;&#xa;&#xa;</xsl:text>
	</xsl:template>
	
	<xsl:template match="scripttagproxy">
		<xsl:text>var </xsl:text>
		<xsl:value-of select="@var"/>
		<xsl:text> = new Ext.data.ScriptTagProxy({&#xa;</xsl:text>
		<xsl:call-template name="render-attributes-vert"><xsl:with-param name="attributes" select="@*" /><xsl:with-param name="finalcomma" select="false()" /></xsl:call-template>
		<xsl:text>&#x9;&#x9;}) ;&#xa;&#xa;</xsl:text>
	</xsl:template>
	
	<xsl:template match="checkboxselectionmodel">
		<xsl:text>var </xsl:text>
		<xsl:value-of select="@var"/>
		<xsl:text> = new Ext.grid.CheckboxSelectionModel({&#xa;</xsl:text>
		<xsl:call-template name="render-attributes-vert"><xsl:with-param name="attributes" select="@*" /><xsl:with-param name="finalcomma" select="false()" /></xsl:call-template>
		<xsl:text>&#x9;&#x9;}) ;&#xa;&#xa;</xsl:text>
	</xsl:template>
	
	<xsl:template match="xmlreader">
		<xsl:text>var </xsl:text>
		<xsl:value-of select="@var"/>
		<xsl:text> = new Ext.data.XmlReader({&#xa;</xsl:text>
		<xsl:call-template name="render-attributes-vert"><xsl:with-param name="attributes" select="@*" /><xsl:with-param name="finalcomma" select="false()" /></xsl:call-template>
		<xsl:text>&#x9;&#x9;},&#xa;</xsl:text>
		<xsl:apply-templates select="fields" />
		<xsl:text>) ;&#xa;&#xa;</xsl:text>
	</xsl:template>
	
	<xsl:template match="jsonreader">
		<xsl:text>var </xsl:text>
		<xsl:value-of select="@var"/>
		<xsl:text> = new Ext.data.JsonReader({&#xa;</xsl:text>
		<xsl:call-template name="render-attributes-vert"><xsl:with-param name="attributes" select="@*" /><xsl:with-param name="finalcomma" select="false()" /></xsl:call-template>
		<xsl:text>&#x9;&#x9;},&#xa;</xsl:text>
		<xsl:apply-templates select="fields" />
		<xsl:text>) ;&#xa;&#xa;</xsl:text>
	</xsl:template>
	
	<xsl:template match="arrayreader">
		<xsl:text>var </xsl:text>
		<xsl:value-of select="@var"/>
		<xsl:text> = new Ext.data.ArrayReader({&#xa;</xsl:text>
		<xsl:call-template name="render-attributes-vert"><xsl:with-param name="attributes" select="@*" /><xsl:with-param name="finalcomma" select="false()" /></xsl:call-template>
		<xsl:text>&#x9;&#x9;},&#xa;</xsl:text>
		<xsl:apply-templates select="fields" />
		<xsl:text>) ;&#xa;&#xa;</xsl:text>
	</xsl:template>
	
	<xsl:template match="gridpanel">
		<xsl:text>var </xsl:text>
		<xsl:value-of select="@var"/>
		<xsl:text> = new Ext.grid.GridPanel({&#xa;</xsl:text>
		
		<xsl:call-template name="render-attributes-vert">
			<xsl:with-param name="attributes" select="@*" />
			<xsl:with-param name="finalcomma" select="true()" />
		</xsl:call-template>
		
		<xsl:apply-templates select="columns" />
		
		<xsl:text>}) ;&#xa;&#xa;</xsl:text>
	</xsl:template>
	
	<xsl:template match="window">
		<xsl:text>var </xsl:text>
		<xsl:value-of select="@var"/>
		<xsl:text> = new Ext.Window({&#xa;</xsl:text>
		<xsl:call-template name="render-attributes-vert"><xsl:with-param name="attributes" select="@*" /><xsl:with-param name="finalcomma" select="true()" /></xsl:call-template>
		<xsl:apply-templates select="items" />
		<xsl:if test="buttons">
			<xsl:text>,&#xa;</xsl:text>
			<xsl:apply-templates select="buttons" />
		</xsl:if>
		<xsl:text>}) ;&#xa;&#xa;</xsl:text>
	</xsl:template>
	
	<xsl:template match="panel">
		<xsl:text>var </xsl:text>
		<xsl:value-of select="@var"/>
		<xsl:text> = new Ext.Panel({&#xa;</xsl:text>
		<xsl:call-template name="render-attributes-vert"><xsl:with-param name="attributes" select="@*" /><xsl:with-param name="finalcomma" select="true()" /></xsl:call-template>
		<xsl:text>}) ;&#xa;&#xa;</xsl:text>
	</xsl:template>
	
	<xsl:template match="formpanel">

		<xsl:text>var </xsl:text>
		<xsl:value-of select="@var"/>
		
		<xsl:text> = new Ext.FormPanel({&#xa;</xsl:text>

		<xsl:text>&#x9;&#x9;defaultType: 'textfield',&#xa;</xsl:text>

		<xsl:call-template name="render-attributes-vert">
			<xsl:with-param name="attributes" select="@*" />
			<xsl:with-param name="finalcomma" select="true()" />
		</xsl:call-template>
		
		<xsl:apply-templates select="defaults" />
		<xsl:apply-templates select="items" />
		<xsl:if test="buttons">
			<xsl:text>,&#xa;</xsl:text>
			<xsl:apply-templates select="buttons" />
		</xsl:if>
		<xsl:text>}) ;&#xa;&#xa;</xsl:text>
	</xsl:template>

	<xsl:template match="record">
		<xsl:text>var </xsl:text>
		<xsl:value-of select="@var"/>
		<xsl:text> = &#xa;</xsl:text>
		<xsl:apply-templates select="fields" />
		<xsl:text> ;&#xa;&#xa;</xsl:text>
	</xsl:template>
	
	<xsl:template match="datefield">
		<xsl:text>var </xsl:text>
		<xsl:value-of select="@var"/>
		<xsl:text> = new Ext.form.DateField({&#xa;</xsl:text>
		<xsl:call-template name="render-attributes-vert"><xsl:with-param name="attributes" select="@*" /><xsl:with-param name="finalcomma" select="false()" /></xsl:call-template>
		<xsl:text>&#x9;&#x9;}) ;&#xa;&#xa;</xsl:text>
	</xsl:template>
	
	<xsl:template match="defaults">
		<xsl:text>&#x9;&#x9;defaults: {</xsl:text>
		<xsl:call-template name="render-attributes-horiz" />
		<xsl:text>},&#xa;</xsl:text>
	</xsl:template>

	<xsl:template match="sortinfo">
		<xsl:text>&#x9;&#x9;sortInfo: {</xsl:text>
		<xsl:call-template name="render-attributes-horiz" />
		<xsl:text>},&#xa;</xsl:text>
	</xsl:template>

	<xsl:template match="columns">
		<xsl:text>&#x9;&#x9;columns: [&#xa;</xsl:text>
		<xsl:apply-templates select="column" />
		<xsl:text>&#x9;&#x9;]</xsl:text>
	</xsl:template>

	<xsl:template match="items">
		<xsl:text>&#x9;&#x9;items: [&#xa;</xsl:text>
		<xsl:apply-templates select="field | item" />
		<xsl:text>&#x9;&#x9;]</xsl:text>
		<!--<xsl:if test="position( ) != last( )"><xsl:text>,</xsl:text></xsl:if>
		<xsl:text>&#xa;</xsl:text>-->
	</xsl:template>

	<xsl:template match="fields">
		<xsl:text>&#x9;&#x9;[&#xa;</xsl:text>
		<xsl:choose>
			<xsl:when test="@fieldSet">
				<xsl:apply-templates select="key('fieldSets',@fieldSet)/field" />
			</xsl:when>
			<xsl:otherwise>
				<xsl:apply-templates select="field" />
			</xsl:otherwise>
		</xsl:choose>
		<xsl:text>&#x9;&#x9;]</xsl:text>
	</xsl:template>

	<xsl:template match="field | item | column">
		<xsl:choose>
			<xsl:when test="@var">
				<xsl:text>&#x9;&#x9;</xsl:text>
				<xsl:value-of select="@var" />
			</xsl:when>
			<xsl:otherwise>
				<xsl:text>&#x9;&#x9;{</xsl:text>
				<xsl:call-template name="render-attributes-horiz" />
				<xsl:if test="items">
					<xsl:text>,</xsl:text>
					<xsl:apply-templates select="items" />
					<xsl:text>&#x9;&#x9;</xsl:text>
				</xsl:if>
				<xsl:text>}</xsl:text>
			</xsl:otherwise>
		</xsl:choose>
		<xsl:if test="position( ) != last( )"><xsl:text>,</xsl:text></xsl:if>
		<xsl:text>&#xa;</xsl:text>
	</xsl:template>
	
	<xsl:template match="buttons">
		<xsl:text>&#x9;&#x9;buttons: [&#xa;</xsl:text>
		<xsl:apply-templates select="button" />
		<xsl:text>&#x9;&#x9;]</xsl:text>
	</xsl:template>

	<xsl:template match="button">
		<xsl:text>&#x9;&#x9;{</xsl:text>
		<xsl:call-template name="render-attributes-horiz" />
		<xsl:text>}</xsl:text>
		<xsl:if test="position( ) != last( )"><xsl:text>,</xsl:text></xsl:if>
		<xsl:text>&#xa;</xsl:text>
	</xsl:template>
	
	<xsl:template name="render-attributes-horiz">
		<xsl:for-each select="@*">
			<xsl:value-of select="name()" />
			<xsl:text>: </xsl:text>
			<xsl:choose>
				<xsl:when test="index-of($unquotedNodes,name())">
					<xsl:value-of select="." />
				</xsl:when>
				<xsl:otherwise>
					<xsl:text>'</xsl:text>
					<xsl:value-of select="." />
					<xsl:text>'</xsl:text>
				</xsl:otherwise>
			</xsl:choose>
			<xsl:if test="position( ) != last( )"><xsl:text>,</xsl:text></xsl:if>
		</xsl:for-each>
	</xsl:template>
	
	<xsl:template name="render-attributes-vert">
		<xsl:param name="attributes" />
		<xsl:param name="finalcomma" />
		
		<xsl:for-each select="$attributes">
			<xsl:if test="name() != 'var'">
				<xsl:text>&#x9;&#x9;</xsl:text>
				<xsl:value-of select="name()" />
				<xsl:text>: </xsl:text>
			</xsl:if>
			<xsl:choose>
				<xsl:when test="(name() != 'var') and (count(index-of($unquotedNodes,name())) = 0) ">
					<xsl:text>'</xsl:text>
					<xsl:value-of select="." />
					<xsl:text>'</xsl:text>
				</xsl:when>
				<xsl:otherwise>
					<xsl:if test="(name() != 'var')">
						<xsl:value-of select="." />
					</xsl:if>
				</xsl:otherwise>
			</xsl:choose>
			<xsl:if test="name() != 'var'">
				<xsl:if test="(position( ) != last( )) or $finalcomma"><xsl:text>,</xsl:text></xsl:if>
				<xsl:text>&#xa;</xsl:text>
			</xsl:if>
		</xsl:for-each>
	</xsl:template>
	
</xsl:stylesheet>